# 作者：贺智翔

from requests.structures import CaseInsensitiveDict
import requests
import json
import csv
import urllib3
import subprocess


urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
print("""
****************************************Ipmi批量修改BMC用户名 作者：贺智翔****************************************
***********************************************使用说明***************************************************
1.将需要批量配置的BMC信息填入BMClist.csv，由于未设置标题行，从第一行开始逐行填写。
填写格式：   
    IP1,UserName,Password,用户ID,新用户名
    IP2,UserName,Password,用户ID,新用户名
    IP3,UserName,Password,用户ID,新用户名
    参数：
    用户ID：user_id：待添加用户的 ID。
    新用户名：修改后的用户名。
示例：
    1.1.1.1,admin,password,9,name1
    1.1.1.2,admin,password,9,name1
注意：如果执行本工具时指定的用户ID已被使用，则最近一次配置将覆盖原有配置。    
2.运行xx.exe脚本批量部署。
3.如果BMClist.csv中信息不准确会导致程序中断，需要重新检查并修改BMClist.csv中对应错误行的信息并重新运行程序。
4.xx.py是python源码，可按需进行调试更改但需要自行下载pyinstaller.exe重新编译成exe。

***********************************************免责声明***************************************************
1.本脚本仅为测试用途，请使用方在业务环境中使用和编译该脚本时自行评估风险并承担使用该脚本引起的一切问题。
2.开发者不对本脚本做后续维护和开发（包括但不限于：脚本功能定制、脚本故障排查等）。
*********************************************************************************************************
""")
Agree1 = input("是否已阅读使用说明，并按照说明填写BMClist？Y/N： ")
Agree2 = input("是否已阅读《免责声明》并同意该声明？Y/N： ")
if (Agree1  and  Agree2) == "Y" or (Agree1  and  Agree2) =="y":
    print("Loading....")
    with open("log.csv", "w", encoding="utf-8", newline='') as csvfile:
        fieldnames = ['BMCIP','Result']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        csvfile.close()
    with open('BMClist.csv') as f:
        reader = csv.reader(f)
        print("打开BMClist获取服务器登录信息")
        for row in reader:
            if row:
                IP = (str(row[0]))
                USR = (str(row[1]))
                PWD = (str(row[2]))
                UserID=(str(row[3]))
                name = (str(row[4]))
                try:
                    print("---------------------正在为BMC IP地址为%s的服务器修改BMC用户名---------------------------" % IP)
                    p1 = subprocess.call("ipmitool -I lanplus -H" + IP + " -U " + USR + " -P " + PWD + " user set name " + UserID + " " + name)
                    print("为"+ UserID +"号ID设置用户名：" + name)
                    if p1 ==  0:
                        print("---------------------BMC IP地址为%s的服务器修改BMC用户名完成---------------------------" % IP)
                        Result = True
                    else:
                        print("---------------------BMC IP地址为%s的服务器修改BMC用户名失败---------------------------" % IP)
                        Result = False
                except:
                    print('程序执行异常，请检查中断位置csv源数据是否正确！')
                    Result = str(False)
                with open("log.csv", "a+", encoding="utf-8", newline='') as csvfile:
                    fieldnames = ['BMCIP','Result']
                    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                    writer.writerow({'BMCIP': str(IP),'Result': Result})
                continue
        IP=USR=PWD=Result="NA"
else:
    print("您未阅读并同意使用说明，程序无法执行。")

Over = input("""

*************************************程序执行结束,请按回车键退出！****************************************

""")